package dom4j;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.DOMReader;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class Dom4jUtil {
	/**
	 * 输出格式化的xml文件
	 * @param path			输出指定的路径
	 * @param document		document
	 * @throws IOException
	 */
	public static void wirteXml(String path,Document document) throws IOException{
		//格式化输出，类型IE浏览一样，指定了格式化的方式为缩进式，则非紧凑式
		OutputFormat format = OutputFormat.createPrettyPrint();
		format.setEncoding("UTF-8");//编码方式
		XMLWriter writer=null;
		try {
			writer = new XMLWriter(new FileOutputStream(new File(path)), format);
			writer.write(document);
		}finally{
			closeQuietly(writer);
		}
	}
	
	
	/**
	 * 将对象信息写入到xml中相应元素的子目录中去
	 * @param obj			对象信息
	 * @param ele			xml中的父级元素
	 * @param labelArray	子级元素的标签
	 * @param fieldArray	相应对象中要显示的字段
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 */
	public static void produceObjXML(Object obj,Element ele,String[] labelArray,String[] fieldArray) 
										throws IllegalArgumentException, IllegalAccessException{
		Field[] fields=obj.getClass().getDeclaredFields();//获得对象的所有属性集合
		int len=0;
		Element tempEle=null;
		Field field=null;
		if(labelArray!=null) len=labelArray.length;
		if(len!=0){
			for(int i=0;i<len;i++){
				tempEle=ele.addElement(labelArray[i]);
				field=getField(fields, fieldArray[i]);
				field.setAccessible(true);
				tempEle.setText(String.valueOf(field.get(obj)));
			}
		}
	}
	
	/**
	 * 得到用户Field对应的Field
	 * @param fields
	 * @param userField
	 * @return
	 */
	private static Field getField(Field[] fields,String userField){
		Field tempField=null;
		if(fields!=null && fields.length>0){
			for(Field f:fields){
				if(f.getName().equals(userField)){
					tempField=f;
					break;
				}
			}
		}
		return tempField;
	}
	
	/**
	 * SAXReader实现
	 * 而SAXReader则使用SAX解析器，从不同的输入源构建dom4j树，如可以从xml文件中读取并构建dom4j树
	 * @param fileName  文件名
	 * @return
	 */
	public  static Document saxReader(String fileName) throws DocumentException{
		SAXReader reader = new SAXReader();
		return reader.read(new File(fileName));
	}
	
	/**
	 * DOMReader实现
	 * DOMReader只能一个现有的w3c DOM树构建dom4j树，即只能从一个org.w3c.dom.Document中构建org.dom4j.Document树
	 * @param fileName  文件名
	 * @return
	 * @throws Exception 
	 */
	public static Document domReader(String fileName) throws Exception{
		DocumentBuilder db=DocumentBuilderFactory.newInstance().newDocumentBuilder();
		org.w3c.dom.Document domDocument = db.parse(new File(fileName));
		return  new DOMReader().read(domDocument);
	}
	
	/**
	  * 得到XML文件的根元素
	  * @param document
	  * @return
	  */
	 public static Element getRootElement(Document document){
		 return document.getRootElement();
	 }
	 
	 /**
	  * 得到指定元素的所有子节点
	  * @param element
	  * @return
	  */
	 public static List<Element> getElements(Element element){
		 return element.elements();
	 }
	 
	 /**
	  * 获取某个节点指定名称的子节点
	  * @param element
	  * @param elementName	子节点名称
	  * @return
	  */
	 public static List<Element> getElementsByName(Element element,String elementName){
		 return element.elements(elementName);
	 }
	 
	/**
	 * 关闭XMLWriter
	 * @param writer
	 */
	public static void closeQuietly(XMLWriter writer){
		try {
			if (writer != null) {
				writer.close();
			}
		} catch (IOException e) {
			//ignore
		}
	}
}
